#include "DomainModule.h"

// Dominio
extern QSqlDatabase enjoylifedb;
extern DominioSqlTableModel *cDomain_model;
extern QTableView *cDomain_view;
// Cliente
CDominioSqlTableModel *clients_model;
QTableView *clients_view;
// Shorcuts
// Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
QShortcut* shortcutAlta;
// Definición de acceso directo para borrar un registro mediante la tecla "Supr".
QShortcut* shortcutBaja;
// Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
QShortcut* shortcutModif;

/**
 * @brief DomainModule::DomainModule
 * @param parent
 */
DomainModule::DomainModule(QWidget *parent) :
    QMainWindow(parent)
{
    domain_toolbar = new CustomModulesToolbar();
    //    ManageDomainsToolBar();
    UpdateListsToolBar();
    addToolBar(domain_toolbar);

    // Módelo de dominio
    cDomain_model = new DominioSqlTableModel(this,enjoylifedb);
    cDomain_model->setTable("dominio");
    cDomain_model->setEditStrategy(DominioSqlTableModel::OnFieldChange);
    // Módelo de cliente
    clients_model = new CDominioSqlTableModel(this,enjoylifedb);
    clients_model->setTable("cliente");
    clients_model->setEditStrategy(CDominioSqlTableModel::OnFieldChange);

    QWidget* widget_main = new QWidget();
    QWidget* widget_centro = new QWidget();
    QWidget* widget_derecho = new QWidget();
    QWidget *widgetDominios = new QWidget();

    QGridLayout *grid_main = new QGridLayout();
    QGridLayout *grid_centro = new QGridLayout();
    QGridLayout *grid_derecho = new QGridLayout();
    QGridLayout *grid_abm = new QGridLayout();
    QGridLayout *grid_prinSec = new QGridLayout();
    QGridLayout *grid_fechas = new QGridLayout();
    QGridLayout *grid_cPanel = new QGridLayout();
    QGridLayout *grid_registroNIC = new QGridLayout();

    QGroupBox *group_filtro = new QGroupBox("Filtros y Búsquedas",this);
    QGroupBox *group_abm = new QGroupBox("Alta - Baja - Modificación",this);
    QGroupBox *group_dominio = new QGroupBox("Dominio",this);
    QGroupBox *group_fechas = new QGroupBox("Fecha Alta - Fecha Vencimiento",this);
    QGroupBox *group_cPanel = new QGroupBox("Usuario cPanel - Contraseña cPanel",this);
    QGroupBox *group_registroNIC = new QGroupBox("Registrante NIC - Email Registrante NIC",this);

    QFormLayout *form_filtro = new QFormLayout;
    QFormLayout *form_alta = new QFormLayout;
    QFormLayout *form_baja = new QFormLayout;
    QFormLayout *form_modificar = new QFormLayout;
    QFormLayout *form_guardar = new QFormLayout;
    QFormLayout *form_dominio = new QFormLayout;
    QFormLayout *form_principal = new QFormLayout;
    QFormLayout *form_secundario = new QFormLayout;
    QFormLayout *form_fechaAlta = new QFormLayout;
    QFormLayout *form_fechaVto = new QFormLayout;
    QFormLayout *form_cPanelUs = new QFormLayout;
    QFormLayout *form_cPanelPass = new QFormLayout;
    QFormLayout *form_regNIC = new QFormLayout;
    QFormLayout *form_emailRegNIC = new QFormLayout;

    // Vista de cliente
    clients_view = new QTableView(this);
    clients_view->setModel(clients_model);
    // Vista de dominio
    cDomain_view = new QTableView(widgetDominios);
    cDomain_view->setModel(cDomain_model);

    // Filtro
    QLabel *label_filtro = new QLabel("Búsqueda Rápida por...",0);
    //    label_filtro->setFixedWidth(300);
    label_filtro->setFixedHeight(20);
    label_filtro->setAlignment(Qt::AlignCenter);
    label_filtro->setStyleSheet("background-color: rgb(13, 200, 35); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_filtro->addRow(label_filtro);
    //
    find_razon_social = new QRadioButton("Razón Social",0);
    form_filtro->addRow(find_razon_social);
    connect(find_razon_social,SIGNAL(clicked()),this,SLOT(FindRazonSocial()));
    find_dominio = new QRadioButton("Dominio",0);
    form_filtro->addRow(find_dominio);
    connect(find_dominio,SIGNAL(clicked()),this,SLOT(FindDominio()));
    find_fecha_alta = new QRadioButton("Fecha Alta",0);
    form_filtro->addRow(find_fecha_alta);
    connect(find_fecha_alta,SIGNAL(clicked()),this,SLOT(FindFechaAlta()));
    find_fecha_vto = new QRadioButton("Fecha Vto",0);
    form_filtro->addRow(find_fecha_vto);
    connect(find_fecha_vto,SIGNAL(clicked()),this,SLOT(FindFechaVto()));
    //
    find_line = new QLineEdit(this);
    //    find_line->setFixedWidth(300);
    find_line->setEnabled(false);
    form_filtro->addRow(find_line);
    //
    QPixmap SITIimage("://Images/SITI-Soft_Logo.png");
    //    image.scaled(25,75);
    QLabel *SITILabel = new QLabel("",0);
    SITILabel->setPixmap(SITIimage);
    //    imageLabel->setScaledContents(true);
    //    imageLabel->setAutoFillBackground(true);
    SITILabel->setFixedHeight(225);
    //    imageLabel->setFixedWidth(300);
    SITILabel->setAlignment(Qt::AlignCenter);
    //    form_filtro->addRow(imageLabel);
    group_filtro->setLayout(form_filtro);
    //    group_filtro->setFixedWidth(320);

    // Botones
    altaBtn = new QPushButton(QIcon("://Icons/ABMs/abmAlta48.png"),"");
    form_alta->addRow(altaBtn);
    connect(altaBtn,SIGNAL(clicked()),this,SLOT(AltaBtn()));
    bajaBtn = new QPushButton(QIcon("://Icons/ABMs/abmBaja48.png"),"");
    form_baja->addRow(bajaBtn);
    connect(bajaBtn,SIGNAL(clicked()),this,SLOT(BajaBtn()));
    modificarBtn = new QPushButton(QIcon("://Icons/ABMs/abmModif48.png"),"");
    form_modificar->addRow(modificarBtn);
    connect(modificarBtn,SIGNAL(clicked()),this,SLOT(ModificarBtn()));
    guardarBtn = new QPushButton(QIcon("://Icons/ABMs/guardar48.png"),"");
    form_guardar->addRow(guardarBtn);
    connect(guardarBtn,SIGNAL(clicked()),this,SLOT(GuardarBtn()));
    //
    grid_abm->addLayout(form_alta,0,0);
    grid_abm->addLayout(form_baja,0,1);
    grid_abm->addLayout(form_modificar,0,2);
    grid_abm->addLayout(form_guardar,0,3);
    group_abm->setLayout(grid_abm);

    // Datos
    // Dominio
    line_dominio = new QLineEdit;
    line_dominio->setFixedSize(710,30);
    line_dominio->setAlignment(Qt::AlignCenter);
    line_dominio->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    form_dominio->addRow(line_dominio);
    // Principal - Secundario
    principal = new QRadioButton("Principal");
    form_principal->addRow(principal);
    form_principal->setAlignment(principal,Qt::AlignCenter);
    secundario = new QRadioButton("Secundario");
    form_secundario->addRow(secundario);
    form_secundario->setAlignment(secundario,Qt::AlignCenter);
    //
    grid_prinSec->addLayout(form_principal,0,0);
    grid_prinSec->addLayout(form_secundario,0,1);
    form_dominio->addRow(grid_prinSec);
    //
    group_dominio->setLayout(form_dominio);
    // Fechas
    fecha_alta = new QDateEdit(this);
    fecha_alta->setFixedSize(200,30);
    fecha_alta->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    fecha_alta->setAlignment(Qt::AlignCenter);
    fecha_alta->setDate(date->currentDate());
    form_fechaAlta->addRow(fecha_alta);
    form_fechaAlta->setAlignment(fecha_alta,Qt::AlignCenter);
    fecha_vto = new QDateEdit(this);
    fecha_vto->setFixedSize(200,30);
    fecha_vto->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    fecha_vto->setAlignment(Qt::AlignCenter);
    CalculateNICExpirationDate();
    form_fechaVto->addRow(fecha_vto);
    form_fechaVto->setAlignment(fecha_vto,Qt::AlignCenter);
    //
    grid_fechas->addLayout(form_fechaAlta,0,0);
    grid_fechas->addLayout(form_fechaVto,0,1);
    group_fechas->setLayout(grid_fechas);
    // cPanel y Reg. NIC
    // usuario cPanel
    line_cPanelUs = new QLineEdit;
    line_cPanelUs->setFixedSize(350,30);
    line_cPanelUs->setAlignment(Qt::AlignCenter);
    line_cPanelUs->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    form_cPanelUs->addRow(line_cPanelUs);
    // contraseña cPanel
    line_cPanelPass = new QLineEdit;
    line_cPanelPass->setFixedSize(350,30);
    line_cPanelPass->setAlignment(Qt::AlignCenter);
    line_cPanelPass->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    form_cPanelPass->addRow(line_cPanelPass);

    grid_cPanel->addLayout(form_cPanelUs,0,0);
    grid_cPanel->addLayout(form_cPanelPass,0,1);
    group_cPanel->setLayout(grid_cPanel);
    // Registro NIC
    // Registrante NIC
    line_regNIC = new QLineEdit;
    line_regNIC->setFixedSize(350,30);
    line_regNIC->setAlignment(Qt::AlignCenter);
    line_regNIC->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    form_regNIC->addRow(line_regNIC);
    // email Registrante NIC
    line_emailRegNIC = new QLineEdit;
    line_emailRegNIC->setFixedSize(350,30);
    line_emailRegNIC->setAlignment(Qt::AlignCenter);
    line_emailRegNIC->setStyleSheet("background-color: rgb(0, 139, 56); color: rgb(255, 255, 255); font: 15pt \"Helvetica57-Condensed\";border-style: solid");
    form_emailRegNIC->addRow(line_emailRegNIC);

    grid_registroNIC->addLayout(form_regNIC,0,0);
    grid_registroNIC->addLayout(form_emailRegNIC,0,1);
    group_registroNIC->setLayout(grid_registroNIC);

    grid_centro->addWidget(cDomain_view,0,0);
    grid_centro->addWidget(group_abm,1,0);
    grid_centro->addWidget(group_dominio,2,0);
    grid_centro->addWidget(group_fechas,3,0);
    grid_centro->addWidget(group_cPanel,4,0);
    grid_centro->addWidget(group_registroNIC,5,0);
    widget_centro->setLayout(grid_centro);

    grid_derecho->addWidget(group_filtro,0,0);
    grid_derecho->addWidget(SITILabel,1,0);
    widget_derecho->setLayout(grid_derecho);

    grid_main->addWidget(clients_view,0,0);
    grid_main->addWidget(widget_centro,0,1);
    grid_main->addWidget(widget_derecho,0,2);

    widget_main->setLayout(grid_main);
    setCentralWidget(widget_main);

    UpdateClientList();
    LimpiarListaDominios();

    on_add_domain = false;
    on_edit_domain = false;
    row_edited = -1;

    // Doble click sobre un dominio abre la edición.
    connect(cDomain_view,SIGNAL(clicked(QModelIndex)),this,SLOT(DomainViewClicked(QModelIndex)));
    // Cuando se cambia la fecha de alta de un domino automaticamente se calcula fecha de vto y se setea.
    connect(fecha_alta,SIGNAL(dateChanged(QDate)),this,SLOT(CalculateNICExpirationDate()));
    // Cuando se selecciona un cliente muestra los dominios asociados.
    connect(clients_view,SIGNAL(clicked(QModelIndex)),this,SLOT(SeleccionarCliente()));
    // Definición de acceso directo para actualizr la lista mediante la combinacion de teclas "Ctrl + U".
    QShortcut* shortcutActualizar = new QShortcut(QKeySequence("Ctrl+U"), this);
    connect(shortcutActualizar, SIGNAL(activated()), this, SLOT(UpdateListsBtn()));

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    shortcutAlta = new QShortcut(QKeySequence("Ctrl+A"), cDomain_view);
    connect(shortcutAlta, SIGNAL(activated()), this, SLOT(AltaBtn()));
    // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
    shortcutBaja = new QShortcut(QKeySequence(QKeySequence::Delete), this);
    connect(shortcutBaja, SIGNAL(activated()), this, SLOT(BajaBtn()));
    // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
    shortcutModif = new QShortcut(QKeySequence("Ctrl+M"), this);
    connect(shortcutModif, SIGNAL(activated()), this, SLOT(ModificarBtn()));

    DeshabilitarABM();
}

void DomainModule::ManageDomainsToolBar()
{
    admin_dominio = new QAction("Administrar Dominio/s",this);
    admin_dominio->setIcon(QIcon("://Icons/BarraHerramientas/administrar48.png"));
    admin_dominio->setIconText("Administrar Dominio/s");
    admin_dominio->setToolTip("Administra Lista de Dominion de un Cliente");
    connect(admin_dominio,SIGNAL(triggered()),this,SLOT(ManageDomainsBtn()));

    domain_toolbar->addAction(admin_dominio);
    domain_toolbar->addSeparator();
}

void DomainModule::UpdateListsToolBar()
{
    update_lists = new QAction("Actualizar Listado", this);
    update_lists->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    update_lists->setIconText("Actualizar Listado de Clietes");
    update_lists->setToolTip("Actualiza la lista de clientes");
    connect(update_lists,SIGNAL(triggered()),this,SLOT(UpdateListsBtn()));

    domain_toolbar->addAction(update_lists);
}

void DomainModule::ManageDomainsBtn()
{
    //    ABMDomain *abm_domains = new ABMDomain();

    //    // Se controla para el caso que no existan clientes cargados.
    //    if (cDomain_model->rowCount() == 0) {
    //        QMessageBox::information(this,"Información!","No hay clientes disponibles.");
    //        return;
    //    }

    //    int selection = -1;
    //    if (!(cDomain_view->currentIndex().row() == -1)) {
    //        selection = cDomain_view->currentIndex().row();
    //    }

    //    if (!(selection == -1)) {
    //        enjoylifedb.transaction();

    //        abm_domains->GetClientDomainsInfo(cDomain_model->index(selection,1).data().toString());
    //        abm_domains->show();

    //        enjoylifedb.commit();
    //    } else {
    //        QMessageBox::warning(this, tr("Administrar Dominios"),
    //                             tr("La operación no se puede concretar."
    //                                "\nNingún cliente ha sido seleccionado."));
    //    }
}

void DomainModule::UpdateClientList()
{
    enjoylifedb.transaction();
    QString filtro = "estado is null";
    clients_model->setTable("cliente");
    clients_model->setFilter(filtro);
    if (!(clients_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfClients();
}

/**
 * @brief DomainModule::CorrectViewOfClients
 */
void DomainModule::CorrectViewOfClients()
{
    clients_model->setHeaderData(1,Qt::Horizontal,"Cliente");

    clients_view->setModel(clients_model);
    clients_view->setCornerButtonEnabled(true);
    clients_view->hideColumn(0);
    for (int var = 2; var < 24; ++var) {
        clients_view->hideColumn(var);
    }

    clients_view->setAlternatingRowColors(true);
    clients_view->setGridStyle(Qt::SolidLine);
    clients_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    clients_view->setWordWrap(true);
    clients_view->horizontalHeader()->setStretchLastSection(true);
    clients_view->setSortingEnabled(false);
    clients_view->sortByColumn(1,Qt::SortOrder());
}

/**
 * @brief DomainModule::UpdateDomainsListBtn
 */
void DomainModule::UpdateDomainsList()
{
    enjoylifedb.transaction();
    cDomain_model->setTable("dominio");
    if (!(cDomain_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfDomains();
}

/**
 * @brief DomainModule::CorrectViewOfDomains
 */
void DomainModule::CorrectViewOfDomains()
{
    cDomain_model->setHeaderData(2,Qt::Horizontal,"Dominio");
    cDomain_model->setHeaderData(3,Qt::Horizontal,"Principal");
    cDomain_model->setHeaderData(4,Qt::Horizontal,"Fecha Alta");
    cDomain_model->setHeaderData(5,Qt::Horizontal,"Fecha Vto.");
    cDomain_model->setHeaderData(6,Qt::Horizontal,"Usuario cPanel");
    cDomain_model->setHeaderData(7,Qt::Horizontal,"Contraseña cPanel");
    cDomain_model->setHeaderData(8,Qt::Horizontal,"Registrante NIC");
    cDomain_model->setHeaderData(9,Qt::Horizontal,"Email Registrante NIC");

    cDomain_view->setModel(cDomain_model);
    cDomain_view->setCornerButtonEnabled(true);
    cDomain_view->hideColumn(0);
    cDomain_view->hideColumn(1);

    cDomain_view->setAlternatingRowColors(true);
    cDomain_view->setGridStyle(Qt::SolidLine);
    cDomain_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cDomain_view->setWordWrap(true);
    cDomain_view->setSortingEnabled(false);
    cDomain_view->sortByColumn(3,Qt::AscendingOrder);
    cDomain_view->resizeColumnsToContents();
}

/**
 * @brief DomainModule::UpdateListsBtn
 */
void DomainModule::UpdateListsBtn()
{
    UpdateClientList();
    LimpiarListaDominios();
    DeshabilitarABM();
}

/**
 * @brief DomainModule::LimpiarListaDominios
 */
void DomainModule::LimpiarListaDominios()
{
    filtro_dominio = "val_dominio = '  '";
    enjoylifedb.transaction();
    cDomain_model->setTable("dominio");
    cDomain_model->setFilter(filtro_dominio);
    if (!cDomain_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los dominios, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        CorrectViewOfDomains();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfDomains();
}

/**
 * @brief DomainModule::SeleccionarDominios
 */
void DomainModule::SeleccionarCliente()
{
    int selection = -1;
    if (!(clients_view->currentIndex().row() == -1)) {
        selection = clients_view->currentIndex().row();
    }
    cliente = clients_model->index(selection,1).data().toString();
    QString filtro = "d_razon_social = '" + cliente + "'" ;

    if (!(selection == -1)) {
        enjoylifedb.transaction();
        cDomain_model->setTable("dominio");
        cDomain_model->setFilter(filtro);
        if (! cDomain_model->select()) {
            QMessageBox::critical(this,"Error!", "No hay dominios cargados para este cliente.");
            enjoylifedb.rollback();
            CorrectViewOfDomains();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfDomains();
        DeshabilitarABM();
        altaBtn->setEnabled(true);
        // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
        connect(shortcutAlta, SIGNAL(activated()), this, SLOT(AltaBtn()));
    }
}

/**
 * @brief SeleccionarDominioClienteActual
 */
void DomainModule::SeleccionarDominioClienteActual()
{
    QString filtro = "d_razon_social = '" + cliente + "'" ;
    enjoylifedb.transaction();
    cDomain_model->setTable("dominio");
    cDomain_model->setFilter(filtro);
    if (! cDomain_model->select()) {
        QMessageBox::critical(this,"Error!", "No hay dominios cargados para este cliente.");
        enjoylifedb.rollback();
        CorrectViewOfDomains();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfDomains();
    altaBtn->setEnabled(true);
}

// Filtros rápidos

void DomainModule::FindRazonSocial()
{
    if (find_razon_social->isChecked()) {
        find_dominio->setChecked(false);
        find_fecha_alta->setChecked(false);
        find_fecha_vto->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterDominio()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaVto()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
    }
    else
        find_line->setEnabled(false);
}

void DomainModule::FilterRazonSocial()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filtro_cliente = "razon_social ilike '%" + find_line->text() + "%'";
        filtro_cliente.append(" and estado is null");
        clients_model->setTable("cliente");
        clients_model->filter().clear();
        clients_model->setFilter(filtro_cliente);
        if (!(clients_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientList();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfClients();
        }
    }
    else
        UpdateClientList();
}

void DomainModule::FindDominio()
{
    if (find_dominio->isChecked()) {
        find_razon_social->setChecked(false);
        find_fecha_alta->setChecked(false);
        find_fecha_vto->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaVto()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterDominio()));
    }
    else
        find_line->setEnabled(false);
}

void DomainModule::FilterDominio()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filtro_dominio = "val_dominio ilike '%" + find_line->text() + "%'";
        cDomain_model->setTable("dominio");
        cDomain_model->filter().clear();
        cDomain_model->setFilter(filtro_dominio);
        if (!(cDomain_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            LimpiarListaDominios();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfDomains();
        }
    }
    else
        LimpiarListaDominios();
}

void DomainModule::FindFechaAlta()
{
    if (find_fecha_alta->isChecked()) {
        find_razon_social->setChecked(false);
        find_dominio->setChecked(false);
        find_fecha_vto->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterDominio()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaVto()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
    }
    else
        find_line->setEnabled(false);
}

void DomainModule::FilterFechaAlta()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filtro_dominio = "fecha_alta_nic = '" + find_line->text() + "'";
        cDomain_model->setTable("dominio");
        cDomain_model->filter().clear();
        cDomain_model->setFilter(filtro_dominio);
        if (!(cDomain_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            LimpiarListaDominios();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfDomains();
        }
    }
    else
        LimpiarListaDominios();
}

void DomainModule::FindFechaVto()
{
    if (find_fecha_vto->isChecked()) {
        find_razon_social->setChecked(false);
        find_dominio->setChecked(false);
        find_fecha_alta->setChecked(false);
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterRazonSocial()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterDominio()));
        disconnect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaAlta()));
        find_line->setEnabled(true);
        connect(find_line,SIGNAL(returnPressed()),this,SLOT(FilterFechaVto()));
    }
    else
        find_line->setEnabled(false);
}

void DomainModule::FilterFechaVto()
{
    if (!find_line->text().isEmpty()) {
        enjoylifedb.transaction();
        filtro_dominio = "fecha_vencimiento_nic = '" + find_line->text() + "'";
        cDomain_model->setTable("cliente");
        cDomain_model->filter().clear();
        cDomain_model->setFilter(filtro_dominio);
        if (!(cDomain_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            LimpiarListaDominios();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfDomains();
        }
    }
    else
        LimpiarListaDominios();
}

// Funciones de los botones
/**
 * @brief DomainModule::on_altaBtn_clicked
 */
void DomainModule::AltaBtn()
{
    if (!line_dominio->text().isEmpty()) {
        QMessageBox::StandardButton button;
        button = QMessageBox::question(this, tr("Alerta!"),
                                       "Actualmente está editando un dominio "
                                       "quiere cancelar la operación e ingresar uno nuevo?",
                                       QMessageBox::Yes | QMessageBox::No);

        if (button == QMessageBox::Yes) {
            on_add_domain = true;
            on_edit_domain = false;
            bajaBtn->setEnabled(false);
            modificarBtn->setEnabled(false);
            guardarBtn->setEnabled(false);
            connect(line_dominio,SIGNAL(textChanged(QString)),this,SLOT(HabilitarGuardarBtn()));
            line_dominio->clear();
            line_dominio->setEnabled(true);
            line_dominio->setFocus();
            principal->setChecked(false);
            principal->setEnabled(true);
            secundario->setChecked(false);
            secundario->setEnabled(true);
            fecha_alta->setEnabled(true);
            fecha_alta->setDate(date->currentDate());
            fecha_vto->setEnabled(true);
            line_cPanelUs->setEnabled(true);
            line_cPanelPass->setEnabled(true);
            line_regNIC->setEnabled(true);
            line_emailRegNIC->setEnabled(true);
            CalculateNICExpirationDate();
            return;
        }
    }
    else {
        on_add_domain = true;
        on_edit_domain = false;
        bajaBtn->setEnabled(false);
        modificarBtn->setEnabled(false);
        guardarBtn->setEnabled(false);
        connect(line_dominio,SIGNAL(textChanged(QString)),this,SLOT(HabilitarGuardarBtn()));
        line_dominio->clear();
        line_dominio->setEnabled(true);
        line_dominio->setFocus();
        principal->setChecked(false);
        principal->setEnabled(true);
        secundario->setChecked(false);
        secundario->setEnabled(true);
        fecha_alta->setEnabled(true);
        fecha_alta->setDate(date->currentDate());
        fecha_vto->setEnabled(true);
        line_cPanelUs->setEnabled(true);
        line_cPanelPass->setEnabled(true);
        line_regNIC->setEnabled(true);
        line_emailRegNIC->setEnabled(true);
        CalculateNICExpirationDate();
    }
}

/**
 * @brief DomainModule::on_bajaBtn_clicked
 */
void DomainModule::BajaBtn()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Eleminar Dominio"),
                                   "¿Está seguro que quiere "
                                   "eliminar el dominio '" + line_dominio->text() + "'?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        enjoylifedb.transaction();
        if (!cDomain_model->removeRow(cDomain_view->currentIndex().row())) {
            QMessageBox::critical(this,"Error!", "No se pudo eliminar el dominio, vuelva a intentarlo.");
            enjoylifedb.rollback();
            return;
        }
        QMessageBox::information(this,"Exito!", "El dominio fue eliminado correctamente.",
                                 QMessageBox::Ok);

        cDomain_model->submitAll();
        enjoylifedb.commit();
        SeleccionarDominioClienteActual();
        DeshabilitarABM();
    }
}

/**
 * @brief DomainModule::on_modificarBtn_clicked
 */
void DomainModule::ModificarBtn()
{
    guardarBtn->setEnabled(true);
    line_dominio->setEnabled(true);
    line_dominio->setFocus();
    principal->setEnabled(true);
    secundario->setEnabled(true);
    fecha_alta->setEnabled(true);
    fecha_vto->setEnabled(true);
    line_cPanelUs->setEnabled(true);
    line_cPanelPass->setEnabled(true);
    line_regNIC->setEnabled(true);
    line_emailRegNIC->setEnabled(true);
    guardarBtn->setEnabled(true);
    on_add_domain = false;
    on_edit_domain = true;
    row_edited = cDomain_view->currentIndex().row();
}

/**
 * @brief DomainModule::on_guardarBtn_clicked
 */
void DomainModule::GuardarBtn()
{
    QMessageBox::StandardButton button;
    button = QMessageBox::question(this, tr("Guardar Dominio"),
                                   "¿Está seguro que quiere "
                                   "guardar el dominio " + line_dominio->text() + "?",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes) {
        // Se seleccionó la opción de agregar un nuevo dominio.
        if (on_add_domain) {
            if (line_dominio->text().isEmpty()) {
                QMessageBox::critical(this,"Insertar Dominio",
                                      "Advertencia! Debe ingresar un valor para el dominio");
                return;
            }

            // Se decide guardar el dominio
            QSqlRecord record;
            // Se agrega la razon social
            QSqlField rsField(QStringLiteral("d_razon_social"), QVariant::String);
            rsField.setValue(cliente);
            record.append(rsField);
            // Se agrega el nro de cliente
            QSqlField vdField(QStringLiteral("val_dominio"), QVariant::String);
            vdField.setValue(line_dominio->text());
            record.append(vdField);
            // Es principal o secundario
            QSqlField epField(QStringLiteral("es_primaria"), QVariant::String);
            if (principal->isChecked())
                epField.setValue("Principal");
            if (secundario->isChecked())
                epField.setValue("Secundario");
            record.append(epField);
            // Fecha Alta NIC
            QSqlField faNicField(QStringLiteral("fecha_alta_nic"), QVariant::Date);
            faNicField.setValue(fecha_alta->text());
            record.append(faNicField);
            // Fecha Vto NIC
            QSqlField fvNicField(QStringLiteral("fecha_vencimiento_nic"), QVariant::Date);
            fvNicField.setValue(fecha_vto->text());
            record.append(fvNicField);
            // Usuario cPanel
            QSqlField usCpanelField(QStringLiteral("usuario_cpanel"), QVariant::String);
            usCpanelField.setValue(line_cPanelUs->text());
            record.append(usCpanelField);
            // Password cPanel
            QSqlField passCpanelField(QStringLiteral("contrasenia_cpanel"), QVariant::String);
            passCpanelField.setValue(line_cPanelPass->text());
            record.append(passCpanelField);
            // Registrante NIC
            QSqlField regNicField(QStringLiteral("registrante_nic"), QVariant::String);
            regNicField.setValue(line_regNIC->text());
            record.append(regNicField);
            // Email Registrante NIC
            QSqlField eRegNicField(QStringLiteral("email_registrante_nic"), QVariant::String);
            eRegNicField.setValue(line_emailRegNIC->text());
            record.append(eRegNicField);

            enjoylifedb.transaction();
            if (!(cDomain_model->insertRecord(-1, record))) {
                QString error = cDomain_model->lastError().text();
                QMessageBox::critical(this,"Error!", tr("No se pudo insertar el dominio, intentelo de nuevo."
                                                        "\n %1").arg(error));
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();

            SeleccionarDominioClienteActual();
        }

        // El usuario hizo click sobre el boton editar.
        if (on_edit_domain) {
            QString filtro_dominio2 = "id_dominio = '" + idDominio + "'";
            cDomain_model->setFilter(filtro_dominio2);
            enjoylifedb.transaction();
            if (!(cDomain_model->select())) {
                QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo manualmente.");
                enjoylifedb.rollback();
                return;
            }
            enjoylifedb.commit();
            if (cDomain_model->rowCount() == 1) {
                QSqlRecord record = cDomain_model->record(0);

                if (line_dominio->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar Dominio",
                                          "Advertencia! Debe ingresar un valor para el dominio");
                    return;
                }
                if (fecha_alta->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar Dominio",
                                          "Advertencia! Debe ingresar un valor para la fecha de alta");
                    return;
                }
                if (fecha_vto->text().isEmpty()) {
                    QMessageBox::critical(this,"Error Editar Dominio",
                                          "Advertencia! Debe ingresar un valor para la fecha de vencimiento");
                    return;
                }

                record.setValue("val_dominio", line_dominio->text());
                if (principal->isChecked())
                    record.setValue("es_primaria", "Principal");
                if (secundario->isChecked())
                    record.setValue("es_primaria", "Secundario");
                record.setValue("fecha_alta_nic", fecha_alta->text());
                record.setValue("fecha_vencimiento_nic", fecha_vto->text());
                record.setValue("usuario_cpanel", line_cPanelUs->text());
                record.setValue("contrasenia_cpanel", line_cPanelPass->text());
                record.setValue("registrante_nic", line_regNIC->text());
                record.setValue("email_registrante_nic", line_emailRegNIC->text());

                cDomain_model->setRecord(0, record);
                enjoylifedb.transaction();
                if (!cDomain_model->submitAll()) {
                    QString error = cDomain_model->lastError().text();
                    QMessageBox::critical(this,"Error!", tr("No se pudo guardar los cambios realizados, intentelo de nuevo."
                                                            "\n %1").arg(error));
                    enjoylifedb.rollback();
                    return;
                }
                enjoylifedb.commit();
            }

            SeleccionarDominioClienteActual();
        }
        row_edited = -1;
        on_add_domain = false;
        on_edit_domain = false;
        altaBtn->setEnabled(true);
        bajaBtn->setEnabled(false);
        modificarBtn->setEnabled(false);
        guardarBtn->setEnabled(false);
        line_dominio->clear();
        line_dominio->setEnabled(false);
        principal->setChecked(false);
        principal->setEnabled(false);
        secundario->setChecked(false);
        secundario->setEnabled(false);
        fecha_alta->setDate(date->currentDate());
        fecha_alta->setEnabled(false);
        fecha_vto->setDate(date->currentDate());
        fecha_vto->setEnabled(false);
        line_cPanelUs->clear();
        line_cPanelUs->setEnabled(false);
        line_cPanelPass->clear();
        line_cPanelPass->setEnabled(false);
        line_regNIC->clear();
        line_regNIC->setEnabled(false);
        line_emailRegNIC->clear();
        line_emailRegNIC->setEnabled(false);
    }
    else
        return;
}

/**
 * @brief DomainModule::on_cDomain_view_clicked
 * @param index
 */
void DomainModule::DomainViewClicked(const QModelIndex &index)
{
    if (index.row() != -1) {
        altaBtn->setEnabled(false);
        bajaBtn->setEnabled(true);
        modificarBtn->setEnabled(true);
        guardarBtn->setEnabled(false);
        idDominio = cDomain_model->index(index.row(),0).data().toString();
        line_dominio->setText(cDomain_model->index(index.row(),2).data().toString());
        if (cDomain_model->index(index.row(),3).data().toString() == "Principal")
            principal->setChecked(true);
        else
            secundario->setChecked(true);
        fecha_alta->setDate(cDomain_model->index(index.row(),4).data().toDate());
        fecha_vto->setDate(cDomain_model->index(index.row(),5).data().toDate());
        line_cPanelUs->setText(cDomain_model->index(index.row(),6).data().toString());
        line_cPanelPass->setText(cDomain_model->index(index.row(),7).data().toString());
        line_regNIC->setText(cDomain_model->index(index.row(),8).data().toString());
        line_emailRegNIC->setText(cDomain_model->index(index.row(),9).data().toString());
        line_dominio->setEnabled(false);
        principal->setEnabled(false);
        secundario->setEnabled(false);
        fecha_alta->setEnabled(false);
        fecha_vto->setEnabled(false);
        line_cPanelUs->setEnabled(false);
        line_cPanelPass->setEnabled(false);
        line_regNIC->setEnabled(false);
        line_emailRegNIC->setEnabled(false);

        // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
        connect(shortcutBaja, SIGNAL(activated()), this, SLOT(BajaBtn()));
        // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
        connect(shortcutModif, SIGNAL(activated()), this, SLOT(ModificarBtn()));
    }
}

/**
 * @brief DomainModule::CalculateNICExpirationDate
 */
void DomainModule::CalculateNICExpirationDate()
{
    QDate dateVto = fecha_alta->date();
    dateVto.setDate(dateVto.year() + 1, dateVto.month(), dateVto.day());
    fecha_vto->setDate(dateVto);
}

/**
 * @brief HabilitarABM
 */
void DomainModule::HabilitarGuardarBtn()
{
    guardarBtn->setEnabled(true);
}

/**
 * @brief DeshabilitarABM
 */
void DomainModule::DeshabilitarABM()
{
    row_edited = -1;
    on_add_domain = false;
    on_edit_domain = false;
    altaBtn->setEnabled(false);
    bajaBtn->setEnabled(false);
    modificarBtn->setEnabled(false);
    guardarBtn->setEnabled(false);
    line_dominio->setEnabled(false);
    line_dominio->clear();
    principal->setEnabled(false);
    principal->setChecked(false);
    secundario->setEnabled(false);
    secundario->setChecked(false);
    fecha_alta->setEnabled(false);
    fecha_alta->setDate(date->currentDate());
    fecha_vto->setEnabled(false);
    line_cPanelUs->setEnabled(false);
    line_cPanelPass->setEnabled(false);
    line_regNIC->setEnabled(false);
    line_emailRegNIC->setEnabled(false);
    CalculateNICExpirationDate();

    // Definición de acceso directo para agregar un registro mediante la combinacion de teclas "Ctrl + A".
    disconnect(shortcutAlta, SIGNAL(activated()), this, SLOT(AltaBtn()));
    // Definición de acceso directo para borrar un registro mediante la tecla "Supr".
    disconnect(shortcutBaja, SIGNAL(activated()), this, SLOT(BajaBtn()));
    // Definición de acceso directo para modificar un registro mediante la combinacion de teclas "Ctrl + M".
    disconnect(shortcutModif, SIGNAL(activated()), this, SLOT(ModificarBtn()));
}
